package shareing

import (
	"fmt"
	"github.com/smallnest/rpcx/protocol"
	"net/url"
)

const (
	SystemServerError = 0 // 用户定义之外的错误
)

type Error struct {
	code int32
	intr string
}

func (e *Error) Error() string { return e.intr }

// NewError 用户定义错误
func NewError(code int32, intr string) *Error { return &Error{code: code, intr: intr} }

// ParsError 解析信息
func ParsError(err error) (res url.Values, ok bool) {
	msg := err.Error()
	var ParsResult error
	if msg[0] == byte(2) && msg[len(msg)-1] == byte(3) {
		if res, ParsResult = url.ParseQuery(msg[1 : len(msg)-1]); ParsResult != nil {
			return nil, false
		}
		return res, true
	}
	return nil, false
}

// RpcxPreError 处理用户自定义错误
func RpcxPreError(_ *protocol.Message, err error) string {
	if ecode, ok := err.(*Error); ok {
		return fmt.Sprintf("%ccode=%d&intr=%s%c", byte(2), ecode.code, ecode.Error(), byte(3))
	} else { // 系统错误
		return fmt.Sprintf("%ccode=%d&intr=%s%c", byte(2), SystemServerError, err.Error(), byte(3))
	}
}
